From: Andrew Cooper Date: Tue, 22 Jul 2014 16:17:16 +0000 (+0100) Subject: tools/xenconsoled: Log Xen boot messages at startup. X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~4602 X-Git-Url: https://dgit.raspbian.org/%22http:/www.example.com/cgi/%22https://%22%22/%22http:/www.example.com/cgi/%22https:/%22%22?a=commitdiff_plain;h=e40f01f4d5181feb7e280410bf9bf05e8301279a;p=xen.git tools/xenconsoled: Log Xen boot messages at startup. When xenconsoled starts, there will be log lines in the Xen console ring from boot, even though VIRQ_CON_RING is not yet pending. Add a force option to handle_hv_logs() which bypasses the event channel check, allowing xenconsoled to drain the Xen boot messages when it starts, rather than at the first subsequent time that VIRQ_CON_RING becomes set. Signed-off-by: Andrew Cooper CC: Ian Campbell CC: Ian Jackson Acked-by: Ian Campbell --- diff --git a/tools/console/daemon/io.c b/tools/console/daemon/io.c index b1268fa8c4..ac08b5b48a 100644 --- a/tools/console/daemon/io.c +++ b/tools/console/daemon/io.c @@ -907,15 +907,15 @@ static void handle_xs(void) free(vec); } -static void handle_hv_logs(xc_evtchn *xce_handle) +static void handle_hv_logs(xc_evtchn *xce_handle, bool force) { static char buffer[1024*16]; char *bufptr = buffer; unsigned int size; static uint32_t index = 0; - evtchn_port_or_error_t port; + evtchn_port_or_error_t port = -1; - if ((port = xc_evtchn_pending(xce_handle)) == -1) + if (!force && ((port = xc_evtchn_pending(xce_handle)) == -1)) return; do @@ -938,7 +938,8 @@ static void handle_hv_logs(xc_evtchn *xce_handle) "%d (%s)", errno, strerror(errno)); } while (size == sizeof(buffer)); - (void)xc_evtchn_unmask(xce_handle, port); + if (port != -1) + (void)xc_evtchn_unmask(xce_handle, port); } static void handle_log_reload(void) @@ -1024,6 +1025,8 @@ void handle_io(void) "%d (%s)", errno, strerror(errno)); goto out; } + /* Log the boot dmesg even if VIRQ_CON_RING isn't pending. */ + handle_hv_logs(xce_handle, true); } xcg_handle = xc_gnttab_open(NULL, 0); @@ -1134,7 +1137,7 @@ void handle_io(void) errno, strerror(errno)); break; } else if (fds[xce_pollfd_idx].revents & POLLIN) - handle_hv_logs(xce_handle); + handle_hv_logs(xce_handle, false); xce_pollfd_idx = -1; }